package servlets;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JSONSerializer;
import services.ClienteService;
import services.CotizacionService;
import services.RodamientoService;
import services.impl.ClienteServiceImpl;
import services.impl.CotizacionServiceImpl;
import services.impl.RodamientoServiceImpl;
import dominio.Cliente;
import dominio.Cotizacion;
import dominio.Item;
import dominio.Rodamiento;

/**
 * Servlet implementation class CotizarServlet
 */
public class CotizarServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public CotizarServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		CotizacionService cotService = CotizacionServiceImpl.getInstancia();
		RodamientoService rService = RodamientoServiceImpl.getInstancia();
		ClienteService cService = ClienteServiceImpl.getInstancia();
		
		JSONArray jsonItems = (JSONArray) JSONSerializer.toJSON(request.getParameter("items"));
		Cliente cliente = cService.findByID(Integer.parseInt(request.getParameter("clienteID")));
		Integer porcentajeGanancia = Integer.parseInt(request.getParameter("porcentajeGanancia"));
		String codSKF;
		Integer cantidad;
		List<Item> itemsACotizar = new ArrayList<Item>();
		for (int i = 0; i < jsonItems.size(); i++) {
			JSONObject jobj = (JSONObject) jsonItems.get(i);
			codSKF = (String) jobj.get("rod");
			cantidad = Integer.parseInt((String) jobj.get("cant"));
			
			Rodamiento rodamiento = rService.findByID(codSKF);
			
			Item item = new Item(rodamiento, cantidad);
			
			itemsACotizar.add(item);
		}
		
		Cotizacion cotizacion = cotService.getCotizacion(itemsACotizar);
		Float monto = new Float(0);
		//Aplico el porcentaje de ganancia y el descuento a cada item cotizado
		for(Item item : cotizacion.getItems()){
			float precio = item.getPrecio();
			item.setPrecio(new Float(Math.round((precio + precio * porcentajeGanancia/100)*100.00)/100.00));//Limito a 2 decimales, multiplicando por 100.00 y dividiento por 100.00 dentro de Math.round
			monto += item.getPrecio() * item.getCantidad();
		}
		cotizacion.setMonto(new Float(Math.round(monto*100.00)/100.00)); //Limito a 2 decimales
		cotizacion.setFecha(new Date());
		cotizacion.setCliente(cliente);
		cotizacion.setValidez(Integer.parseInt(request.getParameter("validez")));
		
		cotService.grabarCotizacion(cotizacion);
		
		Cotizacion cotizacionGuardada = cotService.findUltimaGuardada();
		
		request.setAttribute("cotizacion", cotizacionGuardada);
		request.getRequestDispatcher("aceptarCotizacion.jsp").forward(request, response);
		
	}

}
